#include <string>
#include <queue>
#include <mutex>
#include <stdio.h>
#include <atomic>
#include <thread>
#include <memory>
#include <functional>
#include <condition_variable>
#include "public.h"
#include "connection.h"
using namespace std;
/*
实现连接池功能模块
*/
class ConnectionPool
{
private:
    /* data */
    ConnectionPool(/* args */);  // 单例 1、构造函数私有化

    bool loadConfigFile();// 从配置文件中加载配置项
    void produceConnectionTask(); // 运行在独立的线程中， 专门负责生产新链接
    void scannerConnectionTask(); // 扫描超过maxIndexTime时间的空闲连接，进行对于的连接回收
    string _ip; // MYSQL的ip地址 
    unsigned short _port; // MYSQL的端口号 3306 
    string _username; // 数据库用户名
    string _password; // 数据库密码
    int _initSize; // 连接池的初始连接量
    string _dbname; // 连接的数据库名
    int _maxSize; // 连接池的最大连接量
    int _maxIdleTime; // 连接池的最大空闲时间
    int _connectionTimeOut; // 连接池获取连接的超时时间

    queue<connection*> _connectionQue; // 存储MYSQL的链接队列
    mutex _queueMutex; // 维护连接队列的线程安全互斥锁

    atomic_int _connectionCnt; // 记录连接所创建的connection连接的总数量  atomic_int是线程安全的  普通的int线程不安全

    condition_variable cv; // 设置条件变量，用于连接生产线程和消费线程的通信

public:
    // 获取连接池对象道的实例
    static ConnectionPool *getConnectionPool(); 
    // 给外部提供一个获取连接池中的一个空闲的可用连接 , 使用智能指针重定义删除器，将要释放的连接变为归还到连接池的链接
    shared_ptr<connection> getConnection();

};
